Переход от макросов стиля С к типобезопасным литералам в С++ представляет фундаментальный сдвиг в удобстве использования языка, устраняя «ловушку NULL» где двусмысленность нулевого макроса приводит к скрытым логическим ошибкам.
1. Ошибка разрешения перегрузки
В устаревших стандартах (С++98), NULL часто определяется как 0. При передаче в перегруженные функции компилятор интерпретирует NULL как целое число. Это подтверждается:
std::cout << "NULL — это целое число";
2. Решение с помощью nullptr
С++11 представил nullptr, ключевое слово типа std::nullptr_t. В отличие от макроса, он не может быть неявно преобразован в целочисленный тип (кроме bool), что гарантирует выбор перегрузок, специфичных для указателей.
3. Связывание и взаимодействие
Современный С++ требует extern "C" чтобы избежать «искажения имён» при связывании с кодом на С (например, скомпилированным с помощью gcc). Сохранение типобезопасных указателей на этом уровне крайне важно.
$$\text{std::nullptr\_t} \neq \text{int}$$